}
}
+void
+gtk_window_maybe_revoke_implicit_grab (GtkWindow *window,
+ GdkDevice *device,
+ GtkWidget *grab_widget)
+{
+ GList *l = window->priv->foci, *cur;
+
+ while (l)
+ {
+ GtkPointerFocus *focus = l->data;
+
+ cur = l;
+ focus = cur->data;
+ l = cur->next;
+
+ if (focus->toplevel != window)
+ continue;
+
+ if (device && focus->device == device &&
+ focus->target != grab_widget &&
+ !gtk_widget_is_ancestor (focus->target, grab_widget))
+ gtk_window_set_pointer_focus_grab (window,
+ focus->device,
+ focus->sequence,
+ NULL);
+ }
+}
+
void
gtk_window_set_pointer_focus_grab (GtkWindow *window,
GdkDevice *device,
return NULL;
}
+static void
+revoke_implicit_grabs (GtkWindowGroup *window_group,
+ GdkDevice *device,
+ GtkWidget *grab_widget)
+{
+ GList *windows, *l;
+
+ windows = gtk_window_group_list_windows (window_group);
+
+ for (l = windows; l; l = l->next)
+ {
+ gtk_window_maybe_revoke_implicit_grab (l->data,
+ device,
+ grab_widget);
+ }
+
+ g_list_free (windows);
+}
+
void
_gtk_window_group_add_grab (GtkWindowGroup *window_group,
GtkWidget *widget)
priv = window_group->priv;
priv->grabs = g_slist_prepend (priv->grabs, widget);
+
+ revoke_implicit_grabs (window_group, NULL, widget);
}
void
info->block_others = block_others;
priv->device_grabs = g_slist_prepend (priv->device_grabs, info);
+
+ revoke_implicit_grabs (window_group, device, widget);
}
void
void gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
GtkWidget *widget);
+void gtk_window_maybe_revoke_implicit_grab (GtkWindow *window,
+ GdkDevice *device,
+ GtkWidget *grab_widget);
+
G_END_DECLS
#endif /* __GTK_WINDOW_PRIVATE_H__ */